/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package 处理流.其他流.标准输入输出流;

import java.io.*;
import java.util.Scanner;

/**
 * @Description 处理流.标准输入输出流 属于处理流
 * System.in 和 System.out 分别代表了系统标准的输入和输出设备
 * 默认输入设备是：键盘 输出设备是：显示器
 * System.in 的类型是 InputStream
 * System.out 的类型是 PrintStream ，其是 OutputStream 的子类 FilterOutputStream 的子类
 * 重定向：通过 System 类的 setIn setOut 方法对默认设备进行改变。例如改变为文件
 * public static void setIn (InputStream in)
 * public static void setOut (PrintStream out)
 * @Author 俊昭
 * @Date 2022/4/26
 */
public class SystemInOutTest {
    public static void main(String[] args) {
        test002();
    }

    /**
     * 使用System.in实现
     * 从键盘输入字符串，要求将读取到的整行字符串转成大写输出。然后继续
     * 进行输入操作，直至当输入“ e ”或者 exit ”时，退出程序。
     */
    public static void test002() {
        BufferedReader br = null;
        try {
            // System.in --> BufferedStream --> InputStreamReader --> BufferedReader 使用匿名对象方便
            br = new BufferedReader(new InputStreamReader(new BufferedInputStream(System.in)));

            boolean flag = true;
            while (flag) {
                System.out.println("请输入英文字符，输入e或exit退出");
                String s = br.readLine();
                if ("e".equals(s) || "exit".equals(s)) {
                    // "e".equals(s) | "exit".equals(s)避免空指针
                    flag = false;
                } else {
                    System.out.println(s.toUpperCase());
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 使用Scanner实现
     * 从键盘输入字符串，要求将读取到的整行字符串转成大写输出。然后继续
     * 进行输入操作，直至当输入“ e ”或者 exit ”时，退出程序。
     */
    public void test001() {
        Scanner sc = new Scanner(System.in);
        // System.in
        // “标准”输入流。该流已经打开并准备提供输入数据。通常，该流对应于键盘输入或由主机环境或用户指定的其他输入源
        boolean flag = true;
        while (flag) {
            System.out.println("请输入英文字符，输入e或exit退出");
            String s = sc.next();
            if (s.equals("e") | s.equals("exit")) {
                flag = false;
            } else {
                System.out.println(s.toUpperCase());
            }
        }
        sc.close();
    }
}
